class Counter2{
    private int count = 0;

    public void add(){
        count++;
    }

    public int getCount(){
        return count;
    }
}
public class Demo1 {
    public static void main(String[] args) throws InterruptedException {
        Counter2 counter2 = new Counter2();
        //未加锁的情况下:
        //循环次数减少,但是线程安全问题依然存在,只是出现的概率变小了
        //次数较少,可能t2还没开始运行,t1就已经运行完毕了(但是具有随机性)
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                synchronized (counter2){
                    counter2.add();
                }
            }
        });

        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                    counter2.add();
                    //t2没有加锁,t1加锁也还是不安全的
                    //因为t2还是没有任何阻塞,还有有随机性
                    //需要加锁进行阻塞等待时,当前所有的线程都是必须加锁的
            }
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("count= "+counter2.getCount());
    }
}
